package app.vo;

import app.utils.EncryptionUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

@Service
public class VerificationCode extends JSONObject {

    private static final long serialVersionUID = 1L;
    /**
     * JSONObject只是一种数据结构，可以理解为JSON格式的数据结构（key-value 结构），
     * 可以使用put方法给json对象添加元素。
     * JSONObject可以很方便的转换成字符串，也可以很方便的把其他对象转换成JSONObject对象。
     */
    private JSONObject map;
    //注入jsonObject
    @Autowired
    private JSONObject jsonObject;

    public VerificationCode(HttpServletRequest request) {
        //收集前端提交的参数保存到map中
        Map<?, ?> properties = request.getParameterMap();
        jsonObject = new JSONObject();
        //获得这个集合的迭代器，保存在iter里面
        Iterator<?> entries = properties.entrySet().iterator();
        //更方便的输出map键值对
        Map.Entry entry;
        //设置name默认值
        String name = "";
        //设置value默认值
        String value = "";
        //判断当前iterator下面是否还有元素
        while (entries.hasNext()) {
            //当元素存在获取下一个
            entry = (Map.Entry) entries.next();
            //获取key键
            name = (String) entry.getKey();
            //获取value值
            Object valueObj = entry.getValue();
            //当值为null的时候设置value值为空
            if (null == valueObj) {
                value = "";
                //测试当前对象类型是否是string类型的数组
            } else if (valueObj instanceof String[]) {
                //将对象强制转换为string类型的数组
                String[] values = (String[]) valueObj;
                //遍历这个数组
                for (String s : values) {
                    //拼接逗号
                    value = s + ",";
                }
                //提取字符串中介于两个指定下标之间的字符
                value = value.substring(0, value.length() - 1);
            } else {
                //转换为字符串
                value = valueObj.toString();
            }
            //判断键不等于下下划线的时候
            if (!"_".equals(name)) {
                //解决一些特殊字符冲突，用了base64解密
                jsonObject.put(name, EncryptionUtil.digestString(value, EncryptionUtil.ALGORITHM_NAME.Decode_BASE_64));
            } else {
                //无字符冲突 且明文传输情况
                jsonObject.put(name, value);
            }
        }
        map = jsonObject;
    }


    public VerificationCode(String jsonStr) {
        map = JSON.parseObject(jsonStr);
    }

    public VerificationCode() {
        map = new JSONObject();
    }

    @Override
    public Object get(Object key) {
        return map.get(key);
    }

    public String getString(String key) {
        return map.getString(key);
    }

    //往map中存入键值对
    @Override
    public Object put(String key, Object value) {
        return map.put(key, value);
    }

    @Override
    public Object putIfAbsent(String key, Object value) {
        return map.putIfAbsent(key, value);
    }

    @Override
    public Object remove(Object key) {
        return map.remove(key);
    }

    public void clear() {
        map.clear();
    }

    public boolean containsKey(Object key) {
        return map.containsKey(key);
    }

    public boolean containsValue(Object value) {
        return map.containsValue(value);
    }

    public Set<Entry<String, Object>> entrySet() {
        return map.entrySet();
    }

    public boolean isEmpty() {
        return map.isEmpty();
    }

    public Set<String> keySet() {
        return map.keySet();
    }

    public void putAll(JSONObject t) {
        map.putAll(t);
    }

    public int size() {
        return map.size();
    }

    public Collection<Object> values() {
        return map.values();
    }

    @Override
    public String toString() {
        return JSON.toJSONString(map, SerializerFeature.WRITE_MAP_NULL_FEATURES, SerializerFeature.QuoteFieldNames, SerializerFeature.WriteNullListAsEmpty);
    }
}
